import request from '@/utils/axios'

export type FolderType = {
  id: number | undefined
  parentId?: number | undefined
  name?: string
  sort?: number
  create_time?: Date
}

// 文件上传相关字段
export interface FileUploadType {
  file: File
  folderId?: number // 文件所属文件夹
  quoteModule?: string // 文件引用所属模块
  quotePageId?: string // 文件引用所属页面 ID
  coverImageId?: number // 视频封面图文件 ID
  duration?: number // 视频、音频时长
  width?: number // 视频、图片的宽度
  height?: number // 视频、图片的高度
}

// 文件编辑相关字段
export type FileUpdateType = {
  id: number | undefined
  url?: string
  folderId?: number | undefined
  name?: string
  alt?: string
  description?: string
  file?: File
  configId?: number // 文件配置 ID，关联文件主配置的 ID
}

export interface FileImageUpdateType extends FileUpdateType {
  width: number // 视频、图片的宽度
  height: number // 视频、图片的高度
}

export interface FileVideoUpdateType extends FileUpdateType {
  coverImageId: number | undefined // 视频封面图文件 ID
  duration: number // 视频、音频时长
  width: number // 视频、图片的宽度
  height: number // 视频、图片的高度
}

// 文件移动
export type FileMoveType = {
  ids: number[]
  folderId: number
}

// 文件相关字段
export type FileType = {
  id?: number | undefined
  url: string
  path?: string // 后端文件路径名，sha256
  filesize?: number
  mimetype?: string // 文件类型
  ext?: string // 文件扩展名
  configId?: number // 文件配置 ID，关联文件主配置的 ID
  folderId?: number | undefined
  name?: string // 文件名称
  alt?: string
  description?: string
  coverImage?: FileType // 视频封面图文件 信息
  quote?: number
  quoteModule?: string // 文件引用所属模块
  quotePageId?: string // 文件引用所属页面 ID
  coverImageId?: number | undefined // 视频封面图文件 ID
  duration?: number // 视频、音频时长
  width?: number // 视频、图片的宽度
  height?: number // 视频、图片的高度
}

export interface FileImageType extends FileType {
  width: number // 视频、图片的宽度
  height: number // 视频、图片的高度
}

export interface FileVideoType extends FileType {
  coverImageId?: number | undefined // 视频封面图文件 ID
  duration?: number // 视频、音频时长
  width?: number // 视频、图片的宽度
  height?: number // 视频、图片的高度
}

export interface FilePageReqType extends PageParam {
  folderId?: number
  name?: string
  mimetype?: string // 文件类型
  sortType?: number
}

// 文件预签名地址 Response Type
export interface FilePresignedUrlResponseType {
  // 文件配置编号
  configId: number
  // 文件上传 URL
  uploadUrl: string
  // 文件 URL
  url: string
}

export interface RecycleFilePageReqType extends PageParam {
  name?: string
  mimetype?: string // 文件类型
  sortType?: number
}

// 文件夹相关API
export const FolderApi = {
  // 创建文件夹
  create: (data: FolderType) => {
    return request.post({ url: '/infra/resource-library-folder/create', data, is_mock: true })
  },
  // 更新文件夹
  update: (data: FolderType) => {
    return request.put({ url: '/infra/resource-library-folder/update', data, is_mock: true })
  },
  // 文件夹重命名
  rename: (data: FolderType) => {
    return request.put({ url: '/infra/resource-library-folder/rename', data, is_mock: true })
  },
  // 文件夹移动
  move: (data: FolderType) => {
    return request.put({ url: '/infra/resource-library-folder/move', data, is_mock: true })
  },
  // 删除文件夹
  delete: (id: number) => {
    return request.delete({ url: '/infra/resource-library-folder/delete?id=' + id, is_mock: true })
  },
  // 查询文件夹列表
  list: () => {
    return request.get({ url: '/infra/resource-library-folder/list', is_mock: true })
  }
}

// 文件上传后端字段转前端字段
export const convertFileUploadField = res => {
  let duration = 0
  if (res.data.duration) {
    duration = res.data.duration
  }
  return {
    url: res.data.url,
    name: res.data.name,
    duration
  }
}

// 文件相关API
export const FileApi = {
  // 创建文件 使用前端直传（S3）时，因不经过后端，需要使用该接口，在后端创建文件数据
  create: (data: FileType) => {
    return request.post({ url: '/infra/resource-library-file/create', data, is_mock: true })
  },
  // 更新文件信息（图片的alt、描述、title、宽高、封面图等信息）
  update: (data: FormData) => {
    return request.upload({ url: '/infra/resource-library-file/update', data, is_mock: true })
  },
  // 文件重命名
  rename: (data: FileUpdateType) => {
    return request.put({ url: '/infra/resource-library-file/rename', data, is_mock: true })
  },
  // 文件移动
  move: (data: FileMoveType) => {
    return request.put({ url: '/infra/resource-library-file/move', data, is_mock: true })
  },
  // 删除文件
  delete: (ids: number[]) => {
    const data = {
      ids
    }
    return request.delete({ url: '/infra/resource-library-file/delete', data, is_mock: true })
  },
  // 获取文件详情，资源管理器中图片的宽高、名称等信息，及视频的封面图信息
  detail: (id: number) => {
    return request.get({ url: '/infra/resource-library-file/detail?id=' + id, is_mock: true })
  },
  // 查询文件分页列表
  page: (params: FilePageReqType) => {
    return request.get({ url: '/infra/resource-library-file/page', params, is_mock: true })
  },
  // 查询文件列引用情况
  quote: (ids: number[]) => {
    const data = {
      ids
    }
    return request.post({ url: '/infra/resource-library-file/check-quote', data, is_mock: true })
  },
  // 获取文件预签名地址
  presignedUrl: (path: string) => {
    return request.get<FilePresignedUrlResponseType>({ url: '/infra/resource-library-file/presigned-url', params: { path }, is_mock: true })
  },
  // 单文件上传
  upload: data => {
    return request.upload({ url: '/infra/resource-library-file/upload', data: { file: data.file, name: data.file.name, type: data.file.type }, is_mock: true })
  },
  // 单文件上传带进度条
  uploadProgress: (data, onUploadProgress: (progressEvent) => void) => {
    return request.upload({ url: '/infra/resource-library-file/upload', data, onUploadProgress, is_mock: true, is_custom_error: true })
  },
  // 多文件上传文
  uploads: data => {
    return request.upload({ url: '/infra/resource-library-file/uploads', data, is_mock: true })
  }
}

// 回收站相关API
export const RecycleApi = {
  // 查询回收站文件列表
  page: (params: RecycleFilePageReqType) => {
    return request.get({ url: '/infra/resource-library-recycle/page', params, is_mock: true })
  },
  // 获取回收站文件总数
  count: () => {
    return request.get({ url: '/infra/resource-library-recycle/count', is_mock: true, is_loading: false })
  },
  // 还原回收站文件
  return: (ids: number[]) => {
    const data = {
      ids
    }
    return request.post({ url: '/infra/resource-library-recycle/return', data, is_mock: true })
  },
  // 删除回收站文件
  delete: (ids: number[]) => {
    const data = {
      ids
    }
    return request.delete({ url: '/infra/resource-library-recycle/delete', data, is_mock: true })
  }
}
